package com.happy.unitconvert.model.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * 汇率响应DTO
 * 用于封装第三方汇率API的响应数据
 *
 * @author Happy
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ExchangeRateResponse {

  /**
   * 基础货币代码
   */
  @JsonProperty("base")
  private String baseCurrency;

  /**
   * 汇率数据获取时间
   */
  @JsonProperty("date")
  private String date;

  /**
   * 时间戳
   */
  @JsonProperty("time_last_updated")
  private Long timeLastUpdated;

  /**
   * 汇率映射表
   * Key: 目标货币代码
   * Value: 汇率值
   */
  @JsonProperty("rates")
  private Map<String, BigDecimal> rates;

  /**
   * API响应是否成功（对于错误响应）
   */
  @JsonProperty("result")
  private String result;

  /**
   * 错误代码（如果有错误）
   */
  @JsonProperty("error-type")
  private String errorType;

  /**
   * 错误消息（如果有错误）
   */
  @JsonProperty("error-info")
  private String errorInfo;

  /**
   * 支持的货币代码列表
   */
  @JsonProperty("supported_codes")
  private String[][] supportedCodes;

  /**
   * 数据创建时间（本地）
   */
  private LocalDateTime createdAt;

  /**
   * 判断响应是否成功
   * 成功的响应有base和rates字段，失败的响应有result和error-type字段
   *
   * @return true 如果成功，false 如果失败
   */
  public boolean isSuccess() {
    // 如果有错误信息，说明失败
    if (result != null && "error".equalsIgnoreCase(result)) {
      return false;
    }
    if (errorType != null) {
      return false;
    }
    // 如果有基础货币和汇率数据，说明成功
    return baseCurrency != null && rates != null && !rates.isEmpty();
  }

  /**
   * 获取指定货币的汇率
   *
   * @param currency 目标货币代码
   * @return 汇率值，如果不存在则返回null
   */
  public BigDecimal getRate(String currency) {
    if (rates == null) {
      return null;
    }
    return rates.get(currency.toUpperCase());
  }

  /**
   * 检查是否支持指定货币
   *
   * @param currency 货币代码
   * @return true 如果支持，false 如果不支持
   */
  public boolean supportsCurrency(String currency) {
    if (rates == null) {
      return false;
    }
    return rates.containsKey(currency.toUpperCase());
  }
}
